package com.sky.sd.system.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sky.sd.common.exception.ServiceException;
import com.sky.sd.system.bean.dto.BasicPairNode;
import com.sky.sd.system.bean.dto.MenuNode;
import com.sky.sd.system.bean.po.Menu;
import com.sky.sd.system.bean.vo.DeleteVo;
import com.sky.sd.system.bean.vo.PermAddVo;
import com.sky.sd.system.bean.vo.PermUpdateVo;
import com.sky.sd.system.constant.SystemConstant;
import com.sky.sd.system.dao.MenuMapper;
import com.sky.sd.system.enums.EnabledType;
import com.sky.sd.system.enums.MenuType;
import com.sky.sd.system.service.IMenuService;
import com.sky.sd.system.service.IPermService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <br/>功能:
 * <br/>版本: 1.0
 * <br/>开发人员: 弓振
 * <br/>创建日期: 2020/8/11 17:37
 * <br/>修改日期: 2020/8/11 17:37
 * <br/>修改列表:
 */
@Service
@Slf4j
public class PermServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IPermService {

    @Override
    public List<MenuNode> listPermByMenuId(String menuId) {
        List<Menu> menus = baseMapper.selectList(Wrappers.<Menu>lambdaQuery()
                .eq(Menu::getParentId, menuId).eq(Menu::getType, MenuType.BUTTON).orderByAsc(Menu::getSort));

        // 转换
        List<MenuNode> topNodes = menus.parallelStream().map(menu -> {
            MenuNode menuTree = new MenuNode();
            BeanUtils.copyProperties(menu, menuTree);
            return menuTree;
        }).sorted().collect(Collectors.toList());

        // 创建树
        topNodes.parallelStream().forEach(node -> {
            postCreateTree(node.getId(),node);
        });
        return topNodes;
    }

    @Override
    public void add(PermAddVo vo) {
        canUpdate(null, vo.getCode());

        Menu menu = new Menu();
        BeanUtils.copyProperties(vo, menu);
        baseMapper.insert(menu);
    }

    @Override
    public void update(PermUpdateVo vo) {
        canUpdate(null, vo.getCode());

        Menu menu = new Menu();
        BeanUtils.copyProperties(vo, menu);
        baseMapper.insert(menu);
    }

    @Override
    public void delete(DeleteVo vo) {
        baseMapper.deleteById(vo.getIds().iterator().next());
    }

    private void postCreateTree(String menuId, MenuNode curNode) {
        List<Menu> menus = baseMapper.selectList(Wrappers.<Menu>lambdaQuery()
                .eq(Menu::getParentId, menuId).eq(Menu::getType, MenuType.BUTTON));
        // 转换
        List<MenuNode> nextNodes = menus.parallelStream().map(menu -> {
            MenuNode menuTree = new MenuNode();
            BeanUtils.copyProperties(menu, menuTree);
            return menuTree;
        }).sorted().collect(Collectors.toList());
        curNode.setChildren(nextNodes);

        // 创建树
        nextNodes.parallelStream().forEach(node -> {
            postCreateTree(node.getId(),node);
        });
    }

    private void canUpdate(String id,String code) {
        int permCnt = baseMapper.selectCount(Wrappers.<Menu>lambdaQuery()
                .eq(StringUtils.isNoneBlank(id),Menu::getId, id).ne(Menu::getCode, code).eq(Menu::getType, MenuType.BUTTON.getType()));
        if(permCnt > 0) {
            throw new ServiceException("权限编码已经存在");
        }
    }
}
